package com.bootdo.app.service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.bootdo.goods.service.TGoodsAllocationService;
import com.bootdo.output.domain.OutStorageDO;
import com.bootdo.output.service.OutStorageDetailService;
import com.bootdo.output.service.OutStorageService;
import com.bootdo.staff.domain.StaffMenuRoleDO;
import com.bootdo.staff.service.StaffMenuRoleService;
import com.bootdo.task.domain.TTaskDO;
import com.bootdo.task.service.TTaskDatilService;
import com.bootdo.task.service.TTaskService;
@Service
public class AssigningTaskService {
	@Autowired
	private  OutStorageService outStorageService;
	@Autowired
	private  TTaskService tTaskService;
	@Autowired
	private	StaffMenuRoleService staffMenuRoleService;
	
//	@Autowired
//	private RoleMenuSer
	/**
	 * 自动分配任务
	 */
	public  TTaskDO assigningTasks(Long UserID) {
		//访问此方法 员工已经已开始工作
		StaffMenuRoleDO  staffMenuRoleDO = new StaffMenuRoleDO();
		staffMenuRoleDO.setStaffId(UserID);
		staffMenuRoleDO.setUserState(12101L); //工作中
		staffMenuRoleDO.setSmenuId(4L);//菜单编号 分拣
		staffMenuRoleService.updateUserState(staffMenuRoleDO); 
		//尚未完成更改状态		 
		//查询该员是否有任务未完成， 12003
		Map<String, Object> map = new HashMap<>();
		map.put("taskStatus", "12003");//在执行中的状态
		map.put("taskName",UserID);
		map.put("offset", 0);
		map.put("limit", 1);
		List<TTaskDO> list = tTaskService.list(map);
		if( list.size() == 0) {//上一个任务已完成
			//加急任务
			Map<String, Object>  taskMap = new HashMap<>();
//		 	//查询上一次订单有无供货商 1
				TTaskDO do1 = tTaskService.getLastTask(UserID);
				if(do1 != null) {
					return do1;
				}else {
				//对比权重 2 
				//查询所有有订单的供货商 和 有在工作的员工  按照时间先后进行排序
				//获取所有分拣任务 要求： 12001 未发布 查
					taskMap.clear();
					taskMap.put("taskStatus", "12001"); 
					taskMap.put("sort", "task_stop_time"); //发布日期倒叙排列
					taskMap.put("order", "desc"); 
					List<TTaskDO> dos  = tTaskService.list(map);
					/**
					 * 循环 dos 查询一共有多少供货商 
					 * 查询对应的单号根据单号查询对应的供应商编号
					 * 数组 存放供应商的编号 
					 */
					List<Long> set = new ArrayList<Long>();//所有供应商
					List<Integer> UserNumber = new ArrayList<>();//供货商下员工数量
					List<Integer> taskNumber = new ArrayList<>();//供货商订单数
					Long orderId =0L;//订单编号
					for (TTaskDO tTaskDO : dos) {//所有的任务
						orderId = Long.valueOf(tTaskDO.getTaskRemark());
						OutStorageDO o =  outStorageService.get(orderId);
						if(!set.contains(o.getProviderId())) {//判断是否存在钙元素 
							set.add(o.getProviderId());
						} 
					}
					Integer Provider =  set.size();//供应商数量
					Map<String, Object>  userMap = new HashMap<>();
					userMap.put("taskStatus", 12003);
					Integer staff = tTaskService.count(map);//员工数量
					taskMap.clear();
					//获取供货商下员的数量
					for (int i = 0; i < set.size(); i++) {
						userMap.put("taskSupplierId", set.get(i));//供应商id
						userMap.put("taskStatus", 12003);//状态执行中
						UserNumber.add(tTaskService.count(taskMap));
						taskMap.clear();
					}
					if(staff<Provider) {//供应商数大于 员工数  
						taskMap.clear();
						taskMap.put("taskGrade", "1001001"); //加急任务
						taskMap.put("sort", "task_stop_time"); //发布日期倒叙排列
						taskMap.put("order", "desc");
						taskMap.put("taskStatus", "12001");
						//查询加急的 时间优先的 //直接分配
						//循环查看没有人员的供应商
						List<TTaskDO> taskWorry = tTaskService.list(taskMap);
						Long SupplierId = 0L;
						if(taskWorry.size()!=0) {
							for (int i = 0; i < taskWorry.size(); i++) {
								SupplierId = taskWorry.get(i).getTaskSupplierId();//供应商id
								for (int j = 0; j < set.size(); j++) {
									if(set.get(j) ==SupplierId ) { 
										if(UserNumber.get(j) == 0) {//如果供货商的分拣员不足一个
											//返回该条任务
											return taskWorry.get(i);
										}
									}
								}
							}
							 
						}else {
							taskMap.put("taskGrade", "1001002");
							List<TTaskDO> taskNoWorry = tTaskService.list(taskMap);
							if(taskNoWorry == null) {
								return null;
							}
							for (int i = 0; i < taskNoWorry.size(); i++) {
								SupplierId = taskNoWorry.get(i).getTaskSupplierId();//供应商id
								for (int j = 0; j < set.size(); j++) {
									if(set.get(j) ==SupplierId ) { 
										if(UserNumber.get(j) == 0) {//如果供货商的分拣员不足一个
											//返回该条任务
 											return taskNoWorry.get(i);
										}
									}
								}
							}
						}
					}else {//员工数量大 于供应商数
						Integer size = 	dos.size();//所有任务单 
						Integer weight = 30; //权重
						staff =staffMenuRoleService.count(map);//员工数量
						taskMap.clear();
						for (int i = 0; i < set.size(); i++) {//查询该供货商订单数量数量
							taskMap.put("taskStatus", "12001"); //状态未发布
							taskMap.put("taskSupplierId", set.get(i)) ;//供应商
							taskNumber.add(tTaskService.count(taskMap));
						}
						Integer UserNum = 0;//每个供应商的人数
						Integer taskNum = 0;//每个供应商的任务单
						List<Integer> residueTaskNumber =  new ArrayList<>();//每个供应商的任务单
						for (int i = 0; i < set.size(); i++) {//查看那个供应商的剩余数量最多
							UserNum = UserNumber.get(i) ;
							taskNum = taskNumber.get(i) ;
							residueTaskNumber.add(taskNum-(UserNum *weight)) ;
						}
						/**
						 * 计算 那个供货商剩余单数最多
						 */
						Integer index = 0;
						Integer max = 0;
						for (int i = 0; i < residueTaskNumber.size(); i++) {  
						    if(residueTaskNumber.get(i)>max) {


					        	max = residueTaskNumber.get(i);
					        	index =i;
					        }
				        }
						//按照供应商查询 获取改供应商 加急排序 时间
						//先查有无加急 再查有无普通
						taskMap.clear();
						taskMap.put("taskStatus", "12001");
						taskMap.put("taskGrade", "1001001"); //加急任务
						taskMap.put("sort", "task_stop_time"); //发布日期倒叙排列
						taskMap.put("order", "desc");
						taskMap.put("offset", 0);
						taskMap.put("limit", 1);
						List<TTaskDO> taskWorry = tTaskService.list(taskMap);
						if(taskWorry.size()!=0) { 
							return taskWorry.get(0);
						}else {
							taskMap.put("taskGrade", "1001002");
							List<TTaskDO> taskNoWorry = tTaskService.list(taskMap);
							if(taskNoWorry.size()==0) {
								return null;
							}
							return taskNoWorry.get(0);
						}
					}
				}
				return null;
		}else {
			//返回上次未完成的订单
			return list.get(0);
		}
	}
}
